#include "fusee.h"
#include "terrain.h"

//fonction d'initialisation et de libération
//Initialise tout à 0
void initFusee(Fusee *f)
{
	 f->idFusee=0;
	 f->idEquipement=0;
	 f->nomJoueur= NULL;
	 f->dimX=0;
	 f->dimY=0;
	 f->posX=0;
	 f->posY=0;
	 f->pointVie=0;

 }

//initialise avec des parametres
void parametreFusee (Fusee *f,int idFusee, int idEquipement, const char *nomJoueur, int dimX, int dimY, int posX, int posY, int pointVie)
{
    setidFusee(f,idFusee);
    setidEquipementFusee(f,idEquipement);
    setnomJoueurFusee (f, nomJoueur, strlen(nomJoueur));
    setdimXFusee (f,dimX);
    setdimYFusee (f,dimY);
    setposXFusee (f,posX);
    setposYFusee (f,posY);
    setpointVieFusee (f,pointVie);
}

/* remarque: il est inutile de liberer la fusee, car celle-ci est allouee dans la pile, elle sera donc liberee a la fin du programme */
void libereFusee(Fusee *f)
{
	assert(f!=NULL);
	free(f->nomJoueur);
}

// accesseurs
int getidFusee(const Fusee *f)
{
	 assert(f!=NULL);
	 return f->idFusee;
}
int getidEquipementFusee(const Fusee *f)
{
	 assert(f!=NULL);
	 return f->idEquipement;
}
char *getnomJoueurFusee(const Fusee *f)
{
	 assert(f!=NULL);
	 return f->nomJoueur;
}

int getdimXFusee(const Fusee *f )
{
	 assert(f!=NULL);
	 return f->dimX;
}
int getdimYFusee(const Fusee *f)
{
	 assert(f!=NULL);
	 return f->dimY;
}
int getposXFusee(const Fusee *f)
{
	 assert(f!=NULL);
	 return f->posX;
}
int getposYFusee(const Fusee *f)
{
	 assert(f!=NULL);
	 return f->posY;
}
int getpointVieFusee(const Fusee *f)
{
	 assert(f!=NULL);
	 return f->pointVie;
}

//Mutateurs
void setidFusee (Fusee *f, int idFusee)
{
	 assert(f!=NULL);
	 assert(f->idFusee >=0);
	 f->idFusee= idFusee;
}

void setidEquipementFusee (Fusee *f, int idEquipement)
{
	 assert(f!=NULL);
	 assert(f->idEquipement >=0);
	 f->idEquipement= idEquipement;
}


/*atention: il faut connaitre la taille des chaines qu'on met dans la structure! */

void setnomJoueurFusee (Fusee *f, const char *nomJoueur, int taille)
{
	 assert(f!=NULL);
	 f->nomJoueur=malloc(sizeof(char)*(taille+1));
	 strcpy(f->nomJoueur,nomJoueur);
}

void setdimXFusee (Fusee *f, int dimX)
{
	 assert(f!=NULL);
	 assert(f->dimX>=0);
	 f->dimX=dimX;
}
void setdimYFusee (Fusee *f, int dimY)
{
	 assert(f!=NULL);
	 assert(f->dimY>=0);
	 f->dimY= dimY;
}
void setposXFusee (Fusee *f, int posX)
{
	 assert(f!=NULL);
	 assert (posX >= 0);
	f->posX= posX;
}

void setposYFusee (Fusee *f, int posY)
{
	 assert(f!=NULL);
	 f->posY= posY;
}
void setpointVieFusee (Fusee *f, int pointVie)
{
	 assert(f!=NULL);
	 assert(f->pointVie>=0);
	 f->pointVie= pointVie;
}

//gestion des fusees
int posXmoyenneFusee (Fusee *f)
{
    int pos;
    pos=getposXFusee(f)+(getdimXFusee(f)/2)-10;
    return pos;
}

void deplacerFuseeGauche (Fusee *f)
{
    assert (f!=NULL);

    if (f->posX>0)
    {
        f->posX = f->posX-1;
    }

}

void deplacerFuseeDroite (Fusee *f)
{
    assert (f!=NULL);
    int bordDroit;
    bordDroit= 800 - getdimXFusee(f);

    if (f->posX<bordDroit)
    {
            f->posX = f->posX+1;

    }
}

void deplacerFuseeHaut (Fusee *f)
{
    assert (f!=NULL);

    if (f->posY>0)
    {
            f->posY = f->posY-1;

    }
}

void deplacerFuseeBas (Fusee *f)
{
    assert (f!=NULL);

    int bordBas;
    bordBas= 600-getdimYFusee(f);
    if (f->posY<bordBas)
    {
            f->posY = f->posY+1;

    }
}


void resterSurPlace (Fusee *f)
{
    assert(f!=NULL);
    f->posY = f->posY;
}
//Gestion des collisions

void enleverPointsVie (Fusee *f, Equipement *eq)
{

    if (getpointVieFusee(f)!=0)
    {
        // Fusee du haut
        if (getidFusee(f)==1)
        {
            if (getidEquipement(eq)==10)
            {
                f->pointVie=f->pointVie + 5;
            }
            if (getidEquipement(eq)==20)
            {
                f->pointVie=f->pointVie - 5;
            }
        }

        // Fusee du haut
        if (getidFusee(f)==2)
        {
            if (getidEquipement(eq)==10)
            {
                f->pointVie=f->pointVie - 5;
            }
            if (getidEquipement(eq)==20)
            {
                f->pointVie=f->pointVie + 5;
            }
        }
    }
}

void ajouterPointsVieFusee(Fusee *f)
{
    f->pointVie=f->pointVie+20;
}

//Test de non-régression
void testRegressionFusee()
{
    printf("###  Test du module fusee ### \n");

	Fusee fusee;
	Fusee fusee2;

	//test des fonctions d'initialisation
    initFusee (&fusee);
    printf("-- Fonctions d'initialisation testees avec succes -- \n");

    //test des accesseurs et mutateurs

    setidFusee (&fusee, 2);
	setidEquipementFusee (&fusee, 2);
	setnomJoueurFusee (&fusee, "houley", 10);
	setdimXFusee (&fusee, 2);
	setdimYFusee (&fusee, 2);
	setposXFusee (&fusee, 2);
	setposYFusee (&fusee, 2);
	setpointVieFusee (&fusee, 2);

	assert (getidFusee(&fusee) ==2);
	assert (getidEquipementFusee(&fusee) ==2);
	assert (strcmp(getnomJoueurFusee(&fusee),"houley") ==0);
	assert (getdimXFusee(&fusee) ==2 );
	assert (getdimYFusee(&fusee) ==2);
	assert (getposXFusee(&fusee) ==2);
	assert (getposYFusee(&fusee) ==2);
	assert (getpointVieFusee(&fusee) ==2);

    printf("-- Accesseurs et mutateurs testes avec succes  -- \n");

    //test de parametreFusee
    initFusee (&fusee2);
    parametreFusee(&fusee2, 2,2,"florent",2,2,2,2,2);

    assert (getidFusee(&fusee2) ==2);
	assert (getidEquipementFusee(&fusee2) ==2);
	assert (strcmp(getnomJoueurFusee(&fusee2),"florent") == 0);
	assert (getdimXFusee(&fusee2) ==2 );
	assert (getdimYFusee(&fusee2) ==2);
	assert (getposXFusee(&fusee2) ==2);
	assert (getposYFusee(&fusee2) ==2);
	assert (getpointVieFusee(&fusee2) ==2);

    printf("-- Fonction de parametrage testee avec succes  -- \n");

    //test des fonctions de deplacement
    deplacerFuseeGauche (&fusee);
    assert (getposXFusee(&fusee) ==1);

    deplacerFuseeDroite(&fusee);
    assert (getposXFusee(&fusee) ==2);

    printf("-- Fonctions de deplacement testees avec succes  -- \n");

    //test de la fonction de libération
    libereFusee(&fusee);
    libereFusee(&fusee2);

    printf("-- Fonction de liberation testee avec succes  -- \n");

    printf("***  Test du module fusee realise avec succes *** \n\n\n");
}
